package filter

import (
	"fmt"
	"github.com/beego/beego/v2/server/web/context"
	R "ksd-social-api/commons/result"
	"ksd-social-api/modules/login/model/dto"
	pservice "ksd-social-api/modules/platform/service"
	"ksd-social-api/modules/user/service"
	"ksd-social-api/utils"
	"ksd-social-api/utils/rdb"
	"strconv"
)

var userVipService = service.UserVipService{}
var userService = service.UserService{}
var systemService = pservice.PlatformSystemService{}

func LoginFilter(ctx *context.Context) {
	isUrlExist := ValidateURL(ctx.Request.URL.Path)
	if !isUrlExist {
		Token := ctx.Request.Header["Authorization"]
		if len(Token) == 0 {
			ctx.Output.JSON(R.FailCodeMsg(60001, "请携带token进行访问"), true, false)
			return
		}

		// 获取头部用户的uid
		userLoginUuid := Token[0]
		if len(userLoginUuid) == 0 {
			ctx.Output.JSON(R.FailCodeMsg(60001, "请携带token进行访问"), true, false)
			return
		}

		// 判断当前的token是不是在redis的黑名单中，如果是就直接返回 ---退出 ---7
		cacheKey := fmt.Sprintf("USER:BLACKlIST:%s", userLoginUuid)
		cacheUuid, _ := rdb.RdbGet(cacheKey)
		if len(cacheUuid) > 0 && cacheUuid == userLoginUuid {
			// 如果过期了就直接返回，token失效
			ctx.Output.JSON(R.FailCodeMsg(80001, "请联系客服，你已被拉入黑名单!"), true, false)
			return
		}

		// 如果用户还在登录中就开始使用UUID到缓存中获取用户信息
		cacheLoginKey := fmt.Sprintf("LOGIN:USER:%s", userLoginUuid)
		cacheUser, err := rdb.RdbHGet(cacheLoginKey, "user")
		if err == nil {
			userDto := dto.UserDto{}
			utils.JsonToStruct(cacheUser.(string), &userDto)

			SystemIdArr := ctx.Request.Header["Systemid"]
			systemId, _ := strconv.ParseUint(SystemIdArr[0], 10, 64)
			platformSystemVo := systemService.GetPlatformSystemService(systemId)

			// 如果用户不为空，但是被拉黑了直接
			user := userService.IsForbiddenUser(userDto.Id, systemId)
			if user == nil {
				// 如果过期了就直接返回，token失效
				ctx.Output.JSON(R.FailCodeMsg(80001, "账号已被禁止!"), true, false)
				return
			}
			// 如果没有。就获取用户信息，下放到路由处理方法中，这样给后续需要用户信息的地方可以直接获取
			ctx.Input.SetData("uuid", user.Uuid)
			ctx.Input.SetData("userId", user.Id)
			ctx.Input.SetData("username", user.Username)
			ctx.Input.SetData("avatar", user.Avatar)
			ctx.Input.SetData("phone", user.Telephone)
			ctx.Input.SetData("nickname", user.Nickname)
			ctx.Input.SetData("address", user.Address)
			ctx.Input.SetData("systemId", SystemIdArr[0])
			ctx.Input.SetData("vipType", user.VipFlag)
			ctx.Input.SetData("systemName", platformSystemVo.Sysname)
			// 实时监听用户是否过期
			userVipService.UserVipSettingPeriod(user.Id, systemId)
		} else {
			ctx.Output.JSON(R.FailCodeMsg(60001, "请登录"), true, false)
		}
	}
}
